#include "stm32f10x.h"                  // Device header
#include "myI2C.h"
#include "MPU6050_Reg.h"


#define MPU6050_ADDRESS    0xD0


/*
@brief: 写入数据
@param: 寄存器地址
@param: 要写入的数据
@revatal: 无
*/
void MPU6050_WriteReg(uint8_t Reg_ADDRESS, uint8_t Data)
{
	myI2C_Start();
	myI2C_SendByte(MPU6050_ADDRESS);
	myI2C_ReceiveAck();
	myI2C_SendByte(Reg_ADDRESS);
	myI2C_ReceiveAck();
	myI2C_SendByte(Data);
	myI2C_ReceiveAck();
	myI2C_Stop();
}

/*
@brief: 读取数据
@param: 寄存器地址
@revatal: 读取的数据
*/
uint8_t MPU6050_ReadReg(uint8_t Reg_ADDRESS)
{
	uint8_t Data;
	
	myI2C_Start();
	myI2C_SendByte(MPU6050_ADDRESS);
	myI2C_ReceiveAck();
	myI2C_SendByte(Reg_ADDRESS);
	myI2C_ReceiveAck();
	
	myI2C_Start();
	myI2C_SendByte(MPU6050_ADDRESS | 0x01);
	myI2C_ReceiveAck();
	Data = myI2C_ReceiveByte();
	myI2C_SendAck(1);
	myI2C_Stop();
	
	return Data;
}

/*
@brief: MPU6050初始化, 建立在I2C上的
@param: 无
@revatal: 无
*/
void MPU6050_Init(void)
{
	myI2C_Init();
	MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0X01);
	MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0X00);
	MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0X09);
	MPU6050_WriteReg(MPU6050_CONFIG, 0X06);
	MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0X18);
    MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0X18);
}

/*
@brief: 读取MPU6050加速度计和陀螺仪的数据
@param: X,Y,Z轴 的 加速度&角速度
@revatal: 无
*/
void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, 
					int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
{
	// 分别读取6个轴数据寄存器的高位和地位, 拼接成16位的数据, 再
	// 通过指针变量返回
	uint8_t DataH, DataL;
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);
	*AccX = (DataH << 8) | DataL;

	DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);
	*AccY = (DataH << 8) | DataL;

	DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);
	*AccZ = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);
	*GyroX = (DataH << 8) | DataL;

	DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);
	*GyroY = (DataH << 8) | DataL;

	DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);
	*GyroZ = (DataH << 8) | DataL;
}

/*
@brief: 读取MPU6050设备的ID号
@param: 
@revatal: ID
*/
uint8_t MPU6050_GetID(void)
{
	return MPU6050_ReadReg(MPU6050_WHO_AM_I);
}
